/* shttpd - allocate task structures
   Copyright (C) 2018 Ariadne Devos

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>. */

#include "worker.h"
#include <sHT/compiler.h>
#include <sHT/nospec.h>
#include <sHT/test.h>

#include <stddef.h>
#include <string.h>

/* struct sHT_paper_mill is a stack structure. */

sHT_paper
sHT_alloc_paper(struct sHT_paper_mill *mill)
{
	/* sHT_paper_mill is a stack structure */
	if (sHT_zero_p(mill->length))
		return NULL;
	return mill->first[sHT_index_nospec(--(mill->length), mill->capacity)];
}

void
sHT_free_paper(struct sHT_paper_mill *mill, sHT_paper p)
{
	/* From docstring: p must come from mill.
	   Double-freeing is not allowed. */
	mill->first[sHT_index_nospec(mill->length++, mill->capacity)] = p;
}

